---
title: Использование переменных окружения
description:  Узнайте, как использовать переменные окружения в проекте Astro.
i18nReady: true
---
import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro'

Astro использует встроенную в Vite поддержку переменных окружения и позволяет вам [использовать любой из его методов](https://vitejs.dev/guide/env-and-mode.html) для работы с ними.

Обратите внимание, что, хотя _все_ переменные окружения доступны в коде на стороне сервера, только переменные с префиксом `PUBLIC_` доступны на стороне клиента в целях безопасности.

```ini title=".env"
SECRET_PASSWORD=password123
PUBLIC_ANYBODY=there
```

В этом примере `PUBLIC_ANYBODY` (доступный через `import.meta.env.PUBLIC_ANYBODY`) будет доступен в серверном и клиентском коде, а `SECRET_PASSWORD` (доступный через `import.meta.env.SECRET_PASSWORD`) будет существовать только на стороне сервера.

:::caution
Файлы `.env` не загружаются внутри [конфигурационных файлов](/ru/guides/configuring-astro/#environment-variables). 
:::

## Переменные окружения по умолчанию

Astro включает в себя несколько готовых переменных окружения:

- `import.meta.env.MODE`: Режим, в котором работает ваш сайт. Это `development` при запуске с помощью `astro dev` и `production` при запуске с помощью `astro build`.
- `import.meta.env.PROD`: `true`, если ваш сайт работает в режиме производства; `false` в противном случае.
- `import.meta.env.DEV`: `true`, если ваш сайт работает в режиме разработки; `false` в противном случае. Всегда противоположно `import.meta.env.PROD`.
- `import.meta.env.BASE_URL`: Базовый url, с которого обслуживается ваш сайт. Определяется опцией конфигурации [`base`](/ru/reference/configuration-reference/#base).
- `import.meta.env.SITE`: Устанавливается [опцией `site`](/ru/reference/configuration-reference/#site), указанной в `astro.config` вашего проекта.
- `import.meta.env.ASSETS_PREFIX`: Префикс для ссылок на ресурсы, сгенерированные Astro, если установлена опция конфигурации [`build.assetsPrefix`](/ru/reference/configuration-reference/#buildassetsprefix). Это можно использовать для создания ссылок на ресурсы, не обрабатываемые Astro.

Используйте их как любую другую переменную окружения.

```ts utils.ts
const isProd = import.meta.env.PROD;
const isDev = import.meta.env.DEV;
```

## Настройка переменных окружения

### Файлы `.env`
Переменные окружения могут быть загружены из файлов `.env` в директории проекта.

Вы также можете задать режим (`production` или `development`) в имени файла, например, `.env.production` или `.env.development`, что сделает ваши переменные доступными только в заданном режиме.

Просто создайте файл `.env` в каталоге проекта и добавьте в него несколько переменных.

```ini title=".env"
# Это будет доступно только на стороне сервера!
DB_PASSWORD="foobar"
# Это будет доступно везде!
PUBLIC_POKEAPI="https://pokeapi.co/api/v2"
```

Дополнительные сведения о файлах `.env`, приведены в [документации Vite](https://vitejs.dev/guide/env-and-mode.html#env-files).

### Использование CLI
Вы также можете добавить переменные окружения при запуске проекта:

<PackageManagerTabs>
 <Fragment slot="yarn">
    ```shell
    PUBLIC_POKEAPI=https://pokeapi.co/api/v2 yarn run dev
    ```
 </Fragment>
 <Fragment slot="npm">
    ```shell
    PUBLIC_POKEAPI=https://pokeapi.co/api/v2 npm run dev
    ```
 </Fragment>
 <Fragment slot="pnpm">
    ```shell
    PUBLIC_POKEAPI=https://pokeapi.co/api/v2 pnpm run dev
    ```
 </Fragment>
</PackageManagerTabs>

## Получение переменных окружения

Доступ к переменным окружения в Astro осуществляется с помощью import.meta.env, используя [функцию import.meta, добавленную в ES2020](https://tc39.es/ecma262/2020/#prod-ImportMeta), вместо process.env.

Например, используйте `import.meta.env.PUBLIC_POKEAPI`, чтобы получить переменную окружения `PUBLIC_POKEAPI`.

```js /(?<!//.*)import.meta.env.[A-Z_]+/
// Когда import.meta.env.SSR === true
const data = await db(import.meta.env.DB_PASSWORD);

// Когда import.meta.env.SSR === false
const data = fetch(`${import.meta.env.PUBLIC_POKEAPI}/pokemon/squirtle`);
```

При использовании SSR переменные окружения могут быть доступны во время выполнения в зависимости от используемого адаптера SSR. В большинстве адаптеров вы можете получить доступ к переменным окружения с помощью `process.env`, но некоторые адаптеры работают по-другому. Для адаптера Deno вы будете использовать `Deno.env.get()`. Смотрите, как [получить доступ к среде выполнения Cloudflare](/ru/guides/integrations-guide/cloudflare/#cloudflare-runtime) для работы с переменными окружения при использовании адаптера Cloudflare. Сначала Astro проверит окружение сервера на наличие переменных, и если они не существуют, Astro будет искать их в файлах .env.

## IntelliSense для TypeScript

По умолчанию Astro предоставляет определение типа для `import.meta.env` в файле `astro/client.d.ts`. 

Хотя вы можете объявить больше пользовательских переменных env в файлах `.env.[mode]`, вы можете захотеть получить поддержку TypeScript IntelliSense для пользовательских переменных, которые имеют префикс `PUBLIC_`.

Для этого можно создать `env.d.ts` в `src/` и настроить `ImportMetaEnv` следующим образом:

```ts title="src/env.d.ts"
interface ImportMetaEnv {
  readonly DB_PASSWORD: string;
  readonly PUBLIC_POKEAPI: string;
  // больше переменных env...
}

interface ImportMeta {
  readonly env: ImportMetaEnv;
}
```